package org.yty.travelagencyredis.Dao.impl;

import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import org.yty.travelagencyredis.Dao.TourGroupTravellerDao;
import org.yty.travelagencyredis.model.Entity.TourGroupTraveller;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class TourGroupTravellerDaoImpl implements TourGroupTravellerDao {
    private final StringRedisTemplate redisTemplate;

    @Override
    public List<TourGroupTraveller> selectByTravellerId(Long travellerId) {
        List<Object> list = this.redisTemplate.opsForHash().values(TourGroupTraveller.key);
        return list.stream().map(item -> JSON.parseObject((String) item, TourGroupTraveller.class))
                .filter(item -> item.getTravellerId().equals(travellerId)).toList();
    }

    @Override
    public List<TourGroupTraveller> selectByTourGroupId(Long tourGroupId) {
        return this.redisTemplate.opsForHash().values(TourGroupTraveller.key)
                .stream().map(item -> JSON.parseObject((String) item, TourGroupTraveller.class))
                .filter(item -> item.getTourGroupId().equals(tourGroupId)).toList();
    }

    @Override
    public boolean insert(TourGroupTraveller tourGroupTraveller) {
        this.redisTemplate.opsForHash().put(TourGroupTraveller.key, tourGroupTraveller.getId(), JSON.toJSONString(tourGroupTraveller));
        return true;
    }

    @Override
    public void deleteByTourGroupIdAndTravellerId(Long tourGroupId, Long travellerId) {
        this.redisTemplate.opsForHash().values(TourGroupTraveller.key).stream()
                .map(item -> JSON.parseObject((String) item, TourGroupTraveller.class))
                .filter(item -> item.getTourGroupId().equals(tourGroupId) && item.getTravellerId().equals(travellerId))
                .forEach(item -> this.redisTemplate.opsForHash().delete(TourGroupTraveller.key, item.getId()));
    }

    @Override
    public void deleteByTravellerId(Long travellerId) {
        this.redisTemplate.opsForHash().values(TourGroupTraveller.key).stream()
                .map(item -> JSON.parseObject((String) item, TourGroupTraveller.class))
                .filter(item -> item.getTravellerId().equals(travellerId))
                .forEach(item -> this.redisTemplate.opsForHash().delete(TourGroupTraveller.key, item.getId()));
    }

    @Override
    public void deleteByTourGroupId(Long tourGroupId) {
        this.redisTemplate.opsForHash().values(TourGroupTraveller.key).stream()
                .map(item -> JSON.parseObject((String) item, TourGroupTraveller.class))
                .filter(item -> item.getTourGroupId().equals(tourGroupId))
                .forEach(item -> this.redisTemplate.opsForHash().delete(TourGroupTraveller.key, item.getId()));
    }
}
